DEBUG =		2
MP2000ON =	1
SPRITEDEBUG =	0
EXCLUDEDEBUG =	0
BACKGRDEBUG =	0
GMATHDEBUG =	0

TARGET_BIN =   jimmy2.bin
TARGET_ELF =   jimmy2.elf
AGBINCDIR  =   $(AGBDIR)/include
AGBBACKINCDIR= $(AGBDIR)/include/backup
SOUND_DIR  = msxdata/
ifneq (0,$(MP2000ON))
SOUND_O    = -lsounds
endif
INCDIR=		.
DATAINCDIR =	./data
MBOOTINCDIR =	./mboot
MSXDATAINCDIR =	./msxdata
AGBLIBDIR  =	$(AGBDIR)/lib

.SFILES    =   crt0.s gmathasm.s

# engine code
.CFILES	=	main.c wmem.c log.c gmath.c sprite.c vlx.c mp2000.c backgr.c	\
		multisio.c MultiBoot.c exclude.c camera.c stage.c program.c player.c	\
		multibootgame.c menu.c menudd.c hud.c level.c textd.c			\
		comprog.c juraprog.c computerprog.c cavesprog.c powerprog.c		\
		jellymonsters.c spaceinvaders.c darkprog.c cindysdream.c		\
		quantumprg.c


# multiboot gamecode ,exported from multibootgame
.CFILES += mboot/mbmain.c mboot/astermbstage.c mboot/mbprogram.c mboot/mbmultisio.c \
			mboot/Sio32MultiLoad.c

.CAFILES =	dummyarm.c

# multibootARM files
.CAFILES +=	mboot/mbarm.c


# ARM code / debug THUMB
ifneq (1,$(SPRITEDEBUG))
.CAFILES +=     spritearm.c
else
.CFILES	+=	spritearm.c
endif
ifneq (1,$(EXCLUDEDEBUG))
.CAFILES +=     excludearm.c
else
.CFILES	+=	excludearm.c
endif
ifneq (1,$(BACKGRDEBUG))
.CAFILES +=     backgrarm.c
else
.CFILES	+=	backgrarm.c
endif
ifneq (1,$(GMATHDEBUG))
.CAFILES += gmatharm.c
else
.CFILES	+= gmatharm.c
endif

# common DAT
.DATFILES =	opx_8p8_0p16.dat sincostd.dat

# multiboot binaries
.BINFILES = client.bin

# multiboot datfiles
.DATFILES += data/ascd.dat data/asbd.dat data/mbload.dat

# menu C
.CFILES +=	data/menudata.c data/menudspr.c

# menu DAT
.DATFILES +=	data/menud.dat data/menudsprd.dat

# stages C
.CFILES +=	data/level00.c data/level01.c data/level02.c 			\
		data/level03.c data/level04.c data/level05.c                    \
		data/level06.c data/level07.c data/level08.c                    \
		data/level09.c data/level10.c data/level11.c			\
		data/level12.c

# stages DAT
.DATFILES += 	data/level00d.dat data/level01d.dat data/level02d.dat		\
		data/level03d.dat data/level04d.dat data/level05d.dat           \
		data/level06d.dat data/level07d.dat data/level08d.dat           \
		data/level09d.dat data/level10d.dat data/level11d.dat		\
		data/level12d.dat

# sprites C
.CFILES +=	data/playerspr.c data/powupspr.c data/otherspr.c		\
		data/sharedstgspr.c						\
		data/mapstgspr.c						\
		data/darkdimstgspr.c data/darkdimprgspr.c			\
		data/jurastgspr.c data/juraprgspr.c				\
		data/cindystgspr.c data/cindyprgspr.c				\
		data/computerstgspr.c data/computerprgspr.c			\
		data/cavestgspr.c data/caveprgspr.c				\
		data/quantumdimstgspr.c data/quantumdimprgspr.c			\
		data/jellystgspr.c data/jellyprgspr.c				\
		data/spacestgspr.c data/spaceprgspr.c				\
		data/powerplantstgspr.c data/powerplantprgspr.c		 	\
		data/retrolandstgspr.c						\
		data/astermbspr.c
		

# sprite dat
.DATFILES +=	data/playersprd.dat data/powupsprd.dat data/othersprd.dat	\
		data/sharedstgsprd.dat						\
		data/mapstgsprd.dat						\
		data/darkdimstgsprd.dat data/darkdimprgsprd.dat			\
		data/jurastgsprd.dat data/juraprgsprd.dat			\
		data/cindystgsprd.dat data/cindyprgsprd.dat			\
		data/computerstgsprd.dat data/computerprgsprd.dat		\
		data/cavestgsprd.dat data/caveprgsprd.dat			\
		data/quantumdimstgsprd.dat data/quantumdimprgsprd.dat		\
		data/jellystgsprd.dat data/jellyprgsprd.dat			\
		data/spacestgsprd.dat data/spaceprgsprd.dat			\
		data/powerplantstgsprd.dat data/powerplantprgsprd.dat		\
		data/retrolandstgsprd.dat					\
		data/astermbsprd.dat

# pic files
#.DATFILES +=


.OFILES    =   $(.SFILES:.s=.o) $(.CFILES:.c=.o) $(.DATFILES:.dat=.o) $(.BINFILES:.bin=.o) $(.JPGFILES:.jpg=.o)
.OAFILES   =   $(.CAFILES:.c=.oa)
ASFLAGS    =	-I$(AGBINCDIR) -mthumb-interwork 

# DEBUG level 5 - optimized assembly source
ifeq (5,$(DEBUG))
.C2SFILES    =  $(.CFILES:.c=.c2s)
.C2ASFILES    =  $(.CAFILES:.c=.c2as)
CFLAGS	   =   -DNDEBUG -O9
CAFLAGS	   =   -DNDEBUG
else
# DEBUG level 4 - Full DEBUG
ifeq (4,$(DEBUG))
CFLAGS	   =   -DDEBUG=4 -g3 -O0
CAFLAGS	   =   -DDEBUG=1
else
# DEBUG level 3 - Optimized code with debug info & AGBASSERT & AGBPrint
ifeq (3,$(DEBUG))
CFLAGS	   =   -DDEBUG=3 -g3 -O9
CAFLAGS	   =   -DDEBUG=1
else 
# DEBUG level 2 - Optimized code with debug info & AGBPrint ( no AGBASSERT )
ifeq (2,$(DEBUG))
CFLAGS	   =   -DDEBUG=2 -g3 -O9
CAFLAGS	   =   -DDEBUG=1
else 
# DEBUG level 1 - Optimized code without any debug info but with cheats
ifeq (1,$(DEBUG))
CFLAGS	   =   -DDEBUG=1 -DNDEBUG -O9
CAFLAGS	   =   -DDEBUG=1
else
# DEBUG level 0 - Release
CFLAGS	   =   -DNDEBUG -O9
CAFLAGS	   =   -DNDEBUG
endif
endif
endif
endif
endif


ifeq (1,$(SPRITEDEBUG))
CFLAGS     +=  -DSPRITEDEBUG=1
endif
ifeq (1,$(EXCLUDEDEBUG))
CFLAGS     +=  -DEXCLUDEDEBUG=1
endif
ifeq (1,$(BACKGRDEBUG))
CFLAGS     +=  -DBACKGRDEBUG=1
endif
# mp2000
ifneq (0,$(MP2000ON))
CFLAGS     +=  -DMP2000ON=1
endif

CAFLAGS    +=   -O9 -I$(AGBINCDIR) -I$(AGBBACKINCDIR) -I$(INCDIR)		\
		-I$(DATAINCDIR) -I$(MSXDATAINCDIR) -I$(MBOOTINCDIR) 		\
		-mthumb-interwork -nostdlib	\
		-Wall
CFLAGS	   +=	-I$(AGBINCDIR) -I$(AGBBACKINCDIR) -I$(INCDIR)		\
		-I$(DATAINCDIR) -I$(MSXDATAINCDIR) -I$(MBOOTINCDIR) 		\
		-mthumb-interwork -nostdlib  \
		-Wall

# Linker flags
MAPFILE    =   jimmy2.map

ifeq (0,$(DEBUG))
LDFLAGS	   +=	-Map $(MAPFILE) -nostartfiles -Ttext 0x08000000			\
		-Tbss 0x03000000 -L$(AGBLIBDIR) -L$(SOUND_DIR) -lagbsyscall	\
		-lagbbackup $(SOUND_O)
else
ifeq (1,$(DEBUG))
LDFLAGS	   +=	-Map $(MAPFILE) -nostartfiles -Ttext 0x08000000			\
		-Tbss 0x03000000 -L$(AGBLIBDIR) -L$(SOUND_DIR) -lagbsyscall	\
		-lagbbackup $(SOUND_O)
else
LDFLAGS	   +=	-Map $(MAPFILE) -nostartfiles -Ttext 0x08000000			\
		-Tbss 0x03000000 -L$(AGBLIBDIR) -L$(SOUND_DIR) -lagbsyscall	\
		-lagbbackup -lisagbprn $(SOUND_O)
endif
endif

.SUFFIXES: .dat .bin .c2s .c2as .jpg .oa $(SUFFIXES) 

.dat.o:
	sap 0 4 $<
	objcopy -v -I binary -O elf32-little $< $@

.bin.o:
	sap 0 4 $<
	objcopy -v -I binary -O elf32-little $< $@

.jpg.o:
	sap 0 4 $<
	objcopy -v -I binary -O elf32-little $< $@

.c.oa:
	arm-elf-gcc $(CAFLAGS) -c $(subst .oa,.c,$@)  -o $@

.c.c2s:
	$(CC) -S $(CFLAGS) $< -o $@

.c.c2as:
	arm-elf-gcc -S $(CAFLAGS) $< -o $@


.PHONY: rebuild all clean depend dataall datamenu datalevels datasprites tags

ifeq (0,$(DEBUG))
all:    $(TARGET_BIN)
else
all:    $(TARGET_BIN)
endif

rebuild: clean depend all

clean:
	-rm $(.OFILES) $(.OAFILES) $(.C2SFILES) $(.C2ASFILES) MakedependThumb	\
		MakedependArm $(TARGET_ELF) $(TARGET_BIN)

depend:
	$(CC) $(CFLAGS) -MM $(.CFILES)  > MakedependThumb
	$(CC) $(CFLAGS) -MM $(.CAFILES) > MakedependArmTmp
	depp MakedependArmTmp MakeDependArm oa
	rm MakedependArmTmp

MakedependThumb:
	$(CC) $(CFLAGS) -MM $(.CFILES)  > MakedependThumb

MakedependArm:
	$(CC) $(CFLAGS) -MM $(.CAFILES) > MakedependArmTmp
	depp MakedependArmTmp MakeDependArm oa
	rm MakedependArmTmp

dataall:
	$(MAKE) all -C ./data

datamenu:
	$(MAKE) all -C ./data/menu

datalevels:
	$(MAKE) all -C ./data/levels

datasprites:
	$(MAKE) all -C ./data/sprites

tags:
	ctags -R *.c *.h

$(TARGET_ELF): $(.OFILES) $(SOUND_FILES) $(.OAFILES) $(.C2SFILES) $(.C2ASFILES)	\
		Makefile MakedependThumb MakedependArm
	$(CC) -g -o $@ $(.OFILES) $(SOUND_FILES) $(.OAFILES) -Wl,$(LDFLAGS)

$(TARGET_BIN): $(TARGET_ELF)
	objcopy -v -O binary $< $@

include Gasdepend
include MakedependThumb
include MakedependArm
